using System;
using System.Linq.Expressions;

namespace Agile.DataAccess
{
    /// <summary>
    /// 
    /// </summary>
    /// <typeparam name="T"></typeparam>
	public interface IInsertBuilder<T> : IExecute, IExecuteReturnLastId
	{
        /// <summary>
        /// 
        /// </summary>
		BuilderData Data { get; }
        /// <summary>
        /// 
        /// </summary>
		T Item { get; }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="ignoreProperties"></param>
        /// <returns></returns>
		IInsertBuilder<T> AutoMap(params Expression<Func<T, object>>[] ignoreProperties);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="columnName"></param>
        /// <param name="value"></param>
        /// <param name="parameterType"></param>
        /// <param name="size"></param>
        /// <returns></returns>
		IInsertBuilder<T> Column(string columnName, object value, DataTypes parameterType = DataTypes.Object, int size = 0);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="expression"></param>
        /// <param name="parameterType"></param>
        /// <param name="size"></param>
        /// <returns></returns>
		IInsertBuilder<T> Column(Expression<Func<T, object>> expression, DataTypes parameterType = DataTypes.Object, int size = 0);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="fillMethod"></param>
        /// <returns></returns>
		IInsertBuilder<T> Fill(Action<IInsertUpdateBuilder<T>> fillMethod);
	}
}